package com.gao.unsafe;

import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;


// java.util.ConcurrentModificationException 并发修改异常！
public class ListTest {
    public static void main(String[] args) {
//        并发下 ArrayList 不安全吗？ synchronized:加锁
//        解决方案：
//        1、Vector
//        2、Collections.synchronizedList(new ArrayList<>());
//        3、CopyOnWriteArrayList 写入时复制 COW 计算机程序设计领域的一种优化策略
//        CopyOnWrite容器即写时复制的容器。往一个容器添加元素的时候，不直接往当前容器Object[]添加，而是先将当前容器Object[]进行Copy，
//        复制出一个新的容器Object[] newElements，然后新的容器Object[] newElements里添加元素，添加完元素之后，
//        再将原容器的引用指向新的容器setArray(newElements);这样做的好处是可以对CopyOnWrite容器进行并发的读，
//        而不需要加锁，因为当前容器不会添加任何元素。所以CopyOnWrite容器也是一种读写分离的思想，读和写不同的容器。

//        CopyOnWriteArrayList 比 Vector 牛逼在哪里？ vector采用的是synchronized加锁，这种方法效率低下，而CopyOnWriteArrayList采用的是reentrantLock加锁，效率高;

        List<String> list = new CopyOnWriteArrayList<>();
        for (int i = 1; i <= 10; i++) {
            new Thread(() -> {
                list.add(UUID.randomUUID().toString().substring(0, 8));
                System.out.println(list);
            }, String.valueOf(i)).start();
        }
    }
}
